/* 指定 a 的类型为 never, 那么就意味着 a 以后不能存任何的数据了 */
let a: never

// 以下对 a 的所有赋值都会有警告
// a = 1           // 不能将类型“number”分配给类型“never”。
// a = true        // 不能将类型“boolean”分配给类型“never”。
// a = undefined   // 不能将类型“undefined”分配给类型“never”。
// a = null      // 不能将类型“null”分配给类型“never”。

// 指定 b 的类型为 string
let b: string
// 给 b 设置一个值
b = 'hello'

if (typeof b === 'string') {
  console.log(b.toUpperCase())
} else {
  console.log(b)  // TypeScript 会推断出此处的 a 是 never, 因为没有任何一个符合此处的逻辑
}

// 限制 throwError 函数不需要有任何返回值, 任何值都不行, 像 undefined、null 都不行.
function throwError(str: string): never {
  throw new Error('程序异常退出:' + str)
}

// 1. demo 不能顺利的调用结束, js 中顺利的调用结束默认返回 undifined
// 2. 让函数永远调不完
function demo(): never {  // 返回“从不”的函数不能具有可访问的终结点。
  // demo()  // 递归 永远调不完
  throw new Error('程序运行异常!')
}
